#!/usr/bin/env node

/**
 * 远程数据库表创建执行脚本 - 增强版
 * 连接远程服务器并执行表创建，确保所有表都有正确的备注名
 * 基于 test-code-1336.js 的流程设计
 */

const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');

// 数据库配置
const dbConfig = {
    host: '43.143.253.188',
    port: 3306,
    user: 'nextjs',
    password: 'yEAiRE2jcxTyRBy5',
    database: 'nextjs',
    charset: 'utf8mb4',
    multipleStatements: true,
    acquireTimeout: 60000,
    timeout: 60000
};

// SQL文件列表（按执行顺序）
const sqlFiles = [
    '01_create_tables.sql',
    '02_items_equipment_mounts.sql',
    '03_deputy_faction_chat.sql',
    '04_casino_system.sql',
    '05_other_systems.sql'
];

// 表备注映射（用于验证和补充）
const tableComments = {
    // 用户和角色系统
    'users': '用户表',
    'characters': '角色表',
    'character_attributes': '角色属性表',
    'character_detailed_attributes': '角色详细属性表',
    'character_resources': '角色资源表',
    'character_skills': '角色技能表',
    'character_stones': '角色魂蛋表',
    'character_religions': '角色教派表',
    'character_residences': '角色居住地表',
    'character_locations': '角色位置表',
    'character_training': '角色训练表',

    // 物品、装备、坐骑系统
    'basic_items': '基础物品表',
    'character_inventory': '角色背包表',
    'equipment_base': '装备基础表',
    'character_equipment_inventory': '角色装备背包表',
    'character_equipment': '角色装备穿戴表',
    'mount_base': '坐骑基础表',
    'mount_level_experience': '坐骑等级经验表',
    'character_mounts': '角色坐骑表',
    'mount_training': '坐骑训练表',
    'gem_base': '宝石基础表',
    'gem_attributes': '宝石属性表',
    'character_gem_inventory': '角色宝石背包表',
    'equipment_gem_socket': '装备宝石插槽表',
    'gem_mining': '宝石挖矿表',

    // 副将、帮派、聊天系统
    'deputy_general_base': '副将基础表',
    'deputy_general': '副将表',
    'deputy_general_skill_learned': '副将技能学习表',
    'deputy_general_equipment': '副将装备表',
    'deputy_general_stone': '副将魂蛋表',
    'player_deputy': '玩家副将表',
    'player_deputy_warehouse': '玩家副将仓库表',
    'factions': '帮派表',
    'faction_members': '帮派成员表',
    'chat_messages': '聊天消息表',
    'private_messages': '私聊消息表',
    'system_messages': '系统消息表',
    'social_relations': '社交关系表',
    'announcements': '公告表',
    'monthly_cards': '月卡表',
    'player_online_time': '玩家在线时间表',

    // 娱乐城系统
    'casino_config': '娱乐城配置表',
    'casino_dice_rounds': '骰子游戏轮次表',
    'casino_dice_bets': '骰子游戏下注表',
    'casino_chibi_rounds': '赤壁游戏轮次表',
    'casino_chibi_bets': '赤壁游戏下注表',
    'casino_rock_paper_scissors': '石头剪刀布游戏表',
    'casino_rankings': '娱乐城排行榜表',
    'casino_operation_log': '娱乐城操作日志表',

    // 其他系统
    'map_areas': '地图区域表',
    'areas': '区域表',
    'npc_clusters': 'NPC集群表',
    'npc_details': 'NPC详情表',
    'skill_base': '技能基础表',
    'level_experience': '等级经验表',
    'talent_stones': '天赋石表',
    'shop_goods': '商店商品表',
    'items': '物品表',
    'character_attribute_points': '角色属性点分配表',
    'character_medicine': '角色药品表'
};

async function executeRemoteTableCreation() {
    let connection;

    try {
        console.log('🚀 开始连接远程数据库服务器...');
        console.log(`📡 服务器: ${dbConfig.host}:${dbConfig.port}`);
        console.log(`🗄️  数据库: ${dbConfig.database}`);
        console.log(`👤 用户: ${dbConfig.user}`);

        // 建立数据库连接
        connection = await mysql.createConnection(dbConfig);
        console.log('✅ 数据库连接成功！');

        // 测试连接
        const [rows] = await connection.execute('SELECT 1 as test');
        console.log('✅ 数据库连接测试通过！');

        // 获取当前数据库信息
        const [dbInfo] = await connection.execute('SELECT DATABASE() as current_db, VERSION() as version');
        console.log(`📊 当前数据库: ${dbInfo[0].current_db}`);
        console.log(`🔧 MySQL版本: ${dbInfo[0].version}`);

        // 检查现有表数量
        const [tables] = await connection.execute(`
            SELECT COUNT(*) as table_count 
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
        `, [dbConfig.database]);

        console.log(`📋 当前数据库中的表数量: ${tables[0].table_count}`);

        // 显示现有表列表
        const [existingTables] = await connection.execute(`
            SELECT table_name, table_comment
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
            ORDER BY table_name
        `, [dbConfig.database]);

        if (existingTables.length > 0) {
            console.log('\n📋 现有表列表:');
            existingTables.forEach(table => {
                const comment = table.table_comment || '无备注';
                console.log(`  - ${table.table_name} (${comment})`);
            });
        }

        // 询问是否继续
        console.log('\n⚠️  警告: 此操作将创建/更新约60个表，可能会影响现有数据！');
        console.log('📝 建议在执行前备份现有数据。');
        console.log('🔄 脚本将自动处理表备注设置。');

        // 开始执行SQL文件
        console.log('\n🔄 开始执行表创建脚本...');

        let totalTablesCreated = 0;
        let totalTablesUpdated = 0;
        let totalErrors = 0;
        const createdTables = [];

        for (const sqlFile of sqlFiles) {
            const filePath = path.join(__dirname, 'nestjs-app', 'databasev2', sqlFile);

            if (!fs.existsSync(filePath)) {
                console.log(`❌ 文件不存在: ${sqlFile}`);
                totalErrors++;
                continue;
            }

            console.log(`\n📄 正在执行: ${sqlFile}`);

            try {
                const sqlContent = fs.readFileSync(filePath, 'utf8');

                // 分割SQL语句（按分号分割，但要注意字符串中的分号）
                const statements = sqlContent
                    .split(';')
                    .map(stmt => stmt.trim())
                    .filter(stmt => stmt.length > 0 && !stmt.startsWith('--'));

                let fileTablesCreated = 0;

                for (const statement of statements) {
                    if (statement.trim()) {
                        try {
                            await connection.execute(statement);

                            // 检查是否是CREATE TABLE语句
                            if (statement.toUpperCase().includes('CREATE TABLE')) {
                                const tableName = statement.match(/CREATE TABLE\s+`?(\w+)`?/i);
                                if (tableName) {
                                    const table = tableName[1];
                                    console.log(`  ✅ 创建表: ${table}`);
                                    fileTablesCreated++;
                                    createdTables.push(table);

                                    // 验证表备注是否正确设置
                                    await verifyTableComment(connection, table);
                                }
                            }
                        } catch (error) {
                            if (error.message.includes('already exists')) {
                                console.log(`  ℹ️  表已存在，跳过: ${error.message.split("'")[1] || '未知表'}`);
                                totalTablesUpdated++;
                            } else {
                                console.log(`  ⚠️  SQL执行警告: ${error.message}`);
                            }
                        }
                    }
                }

                totalTablesCreated += fileTablesCreated;
                console.log(`✅ ${sqlFile} 执行完成，创建了 ${fileTablesCreated} 个表`);

            } catch (error) {
                console.log(`❌ 执行 ${sqlFile} 时出错: ${error.message}`);
                totalErrors++;
            }
        }

        // 验证所有表的备注设置
        console.log('\n🔍 验证表备注设置...');
        await verifyAllTableComments(connection);

        // 最终统计
        console.log('\n📊 执行结果统计:');
        console.log(`✅ 成功创建表数量: ${totalTablesCreated}`);
        console.log(`🔄 已存在表数量: ${totalTablesUpdated}`);
        console.log(`❌ 错误数量: ${totalErrors}`);

        // 验证最终表数量
        const [finalTables] = await connection.execute(`
            SELECT COUNT(*) as table_count 
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
        `, [dbConfig.database]);

        console.log(`📋 最终数据库中的表数量: ${finalTables[0].table_count}`);

        // 显示创建的表
        if (createdTables.length > 0) {
            console.log('\n📋 本次创建的表:');
            createdTables.forEach(table => {
                console.log(`  - ${table}`);
            });
        }

        // 显示所有表的备注信息
        const [allTables] = await connection.execute(`
            SELECT table_name, table_comment
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
            ORDER BY table_name
        `, [dbConfig.database]);

        console.log('\n📋 所有表的备注信息:');
        allTables.forEach(table => {
            const comment = table.table_comment || '无备注';
            console.log(`  - ${table.table_name}: ${comment}`);
        });

        if (totalTablesCreated > 0 || totalTablesUpdated > 0) {
            console.log('\n🎉 数据库表创建/更新完成！');
            console.log('💡 建议执行以下操作:');
            console.log('  1. 检查表结构是否正确');
            console.log('  2. 验证外键约束');
            console.log('  3. 测试应用程序连接');
            console.log('  4. 检查表备注是否完整');
        } else {
            console.log('\n⚠️  没有创建任何新表，请检查SQL文件内容。');
        }

    } catch (error) {
        console.error('❌ 执行过程中发生错误:', error.message);
        console.error('🔍 错误详情:', error);

        if (error.code === 'ER_ACCESS_DENIED_ERROR') {
            console.log('\n💡 可能的解决方案:');
            console.log('  1. 检查数据库用户名和密码');
            console.log('  2. 确认用户有CREATE TABLE权限');
            console.log('  3. 检查数据库主机和端口');
        } else if (error.code === 'ECONNREFUSED') {
            console.log('\n💡 可能的解决方案:');
            console.log('  1. 检查数据库服务器是否运行');
            console.log('  2. 确认端口3306是否开放');
            console.log('  3. 检查防火墙设置');
        }
    } finally {
        if (connection) {
            await connection.end();
            console.log('\n🔌 数据库连接已关闭');
        }
    }
}

/**
 * 验证单个表的备注设置
 */
async function verifyTableComment(connection, tableName) {
    try {
        const [result] = await connection.execute(`
            SELECT table_comment
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_name = ?
        `, [dbConfig.database, tableName]);

        if (result.length > 0) {
            const comment = result[0].table_comment;
            if (comment && comment.trim() !== '') {
                console.log(`    ✅ 表备注已设置: ${comment}`);
            } else {
                console.log(`    ⚠️  表备注未设置，尝试补充...`);
                await addTableComment(connection, tableName);
            }
        }
    } catch (error) {
        console.log(`    ❌ 验证表备注失败: ${error.message}`);
    }
}

/**
 * 为表添加备注
 */
async function addTableComment(connection, tableName) {
    try {
        const comment = tableComments[tableName] || `${tableName}表`;
        await connection.execute(`ALTER TABLE \`${tableName}\` COMMENT = '${comment}'`);
        console.log(`    ✅ 已为表 ${tableName} 添加备注: ${comment}`);
    } catch (error) {
        console.log(`    ❌ 添加表备注失败: ${error.message}`);
    }
}

/**
 * 验证所有表的备注设置
 */
async function verifyAllTableComments(connection) {
    try {
        const [tables] = await connection.execute(`
            SELECT table_name, table_comment
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
            ORDER BY table_name
        `, [dbConfig.database]);

        let tablesWithoutComment = 0;

        for (const table of tables) {
            if (!table.table_comment || table.table_comment.trim() === '') {
                console.log(`  ⚠️  表 ${table.table_name} 缺少备注，正在补充...`);
                await addTableComment(connection, table.table_name);
                tablesWithoutComment++;
            }
        }

        if (tablesWithoutComment === 0) {
            console.log('  ✅ 所有表都有正确的备注设置');
        } else {
            console.log(`  ✅ 已为 ${tablesWithoutComment} 个表补充了备注`);
        }
    } catch (error) {
        console.log(`  ❌ 验证表备注失败: ${error.message}`);
    }
}

// 执行主函数
if (require.main === module) {
    executeRemoteTableCreation().catch(console.error);
}

module.exports = { executeRemoteTableCreation, dbConfig, tableComments };
